//
//  LZStatusView.swift
//  Weibo
//
//  Created by lzing on 16/3/25.
//  Copyright © 2016年 lzing. All rights reserved.
//

import UIKit
import SDWebImage

class LZStatusView : NSObject {
    
    /// 单例
    static let sharedStatusView : LZStatusView = LZStatusView()
    
    // 记录是否在加载微博数据
    private var loading : Bool = false
    
    private override init() {
        super.init()
    }

    // 加载数据
    func loadStatus(since_id : Int64, max_id : Int64, loadStatusCompletion: (statuses : [LZStatus]?, error : NSError?) -> ()) {
        // 判断是否有人在加载微博数据
        if loading {
            LZPrint(msg: "有人在加载微博数据")
            // 自定义错误
//            let error = NSError(domain: "cn.itcast.error.net.status", code: -1, userInfo: ["errorDescription" : "嘿哥们,手不要那么快,重复刷新了"])
            loadStatusCompletion(statuses: nil, error: LZNetworkToolError.RepeatRefresh.error())
            return
        }
        // 之前没人加载微博数据
        loading = true
        // 请求数据的url
        let url = "https://api.weibo.com/2/statuses/home_timeline.json"
        // 请求数据的参数
        var parameter : [String : AnyObject] = ["access_token" : LZUserAccountViewModel.sharedUserAccountViewModel.userAccount!.access_token!]
        // 传递了since_id表示要下拉刷新,返回比since_id大的微博
        if since_id > 0 {
            parameter["since_id"] = NSNumber(longLong: since_id)
        } else if max_id > 0 {
            // 有人传递了max_id.添加到字典里面
            parameter["max_id"] = NSNumber(longLong: max_id - 1)
        }
        // 发送请求
        LZNetworkTool.sharedNetworkTool.GET(url, parameters: parameter) { (result, error) -> () in
            // 微博数据加载完成
            self.loading = false
            // 加载出错
            if error != nil {
                // 请求失败
                LZPrint(msg: "加载微博数据出错")
                // 回调
                loadStatusCompletion(statuses : nil, error : error)
                return
            }
            
            // 获取到数据
            let statusArray = result?["statuses"] as? [[String : AnyObject]]
            
            // 定义空数组保存模型
            var statuses = [LZStatus]()
            
            // 遍历字典
            for dict in statusArray! {
                let status = LZStatus(dict: dict)
                statuses.append(status)
            }
            
            // 当图片缓存完成了,才来通知控制器显示微博数据
            self.cacheWebImage(statuses, loadStatusCallback: loadStatusCompletion)
        }
    }
    
    ///  缓存微博图片
    private func cacheWebImage(statuses : [LZStatus], loadStatusCallback : (statuses : [LZStatus]?, error :NSError?) ->()) {
        // 创建组
        let group = dispatch_group_create()
        var length : CGFloat = 0
        // 查找微博里面的图片,并且下载下来
        for status in statuses {
            var downloadURLs = status.pictureURLs
            // 如果原创没有,找转发微博
            if downloadURLs == nil {
                downloadURLs = status.retweeted_status?.pictureURLs
            }
            // 如果还是没有图片,则说明没图片
            if downloadURLs == nil {
                continue
            }
            // 缓存一张图片
            if downloadURLs?.count == 1 {
                let url = downloadURLs?.last
                // 异步进入组
                dispatch_group_enter(group)
                // 下载图片
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    // 离开组
                    dispatch_group_leave(group)
                    // 有错误
                    if error != nil {
//                        LZPrint(msg: "图片下载失败 : \(url)")
                        return
                    }
                    // 图片下载成功
//                    LZPrint(msg: "下载图片成功: \(url)")
                    let data = UIImagePNGRepresentation(image)!
                    length += CGFloat(data.length)
                })
            }
        }
        
        // 所有图片下载完成通知
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
//            let len = length / 1024 / 1024
//            let lengthStr = String(format: "%.2f", arguments: [len])
//            LZPrint(msg: "所有图片缓存完成 : \(lengthStr)MB")
            // 所有图片显示完成,通知控制器显示微博数据
            loadStatusCallback(statuses: statuses, error: nil)
        }
    }
    
    /// 发送微博,不能发同样的内容
    func sendStatus(status : String,image : UIImage? ,sendStatusCallBack : (error : NSError?) -> ()) {
        guard let access_token = LZUserAccountViewModel.sharedUserAccountViewModel.userAccount?.access_token else {
            sendStatusCallBack(error: LZNetworkToolError.EmptyAccessToken.error())
            return
        }
        // 参数
        let parameters = [
            "access_token" : access_token,
            "status" : status
        ]
        // 如果没图片,发送纯文本请求
        if image == nil {
            // url地址
            let urlString = "https://api.weibo.com/2/statuses/update.json"
            // 发送请求
            LZNetworkTool.sharedNetworkTool.POST(urlString, parameters: parameters) { (result, error) -> () in
                if error != nil {
                    sendStatusCallBack(error: error)
                    return
                }
                // 发送成功
                sendStatusCallBack(error: nil)
            }
        } else {
            // 发送图片请求
            let urlString = "https://upload.api.weibo.com/2/statuses/upload.json"
            // 发送数据请求formData
            LZNetworkTool.sharedNetworkTool.POST(urlString, parameters: parameters, constructingBodyWithBlock: { (formData) -> Void in
                let data = UIImagePNGRepresentation(image!)!
                formData.appendPartWithFileData(data, name: "pic", fileName: "abc.png", mimeType: "image/png")
                }, completion: { (result, error) -> () in
                    if error != nil {
                        sendStatusCallBack(error: error)
                        return
                    }
                    sendStatusCallBack(error: nil)
            })
        }
    }
}
